* Added FileSelector interface.
* <v-fileset> now takes file selectors, instead of include and exclude patterns.
* Added a bunch of file selector implementations:
* <and>, <or>, <not> for combining selectors.
* <name>, <basename>, <url> for testing bits of the file name against
an Ant 1 style pattern, or a regular expression.
* <is-file>, <is-folder>, <exists> for testing file type.
* Added <flat-fileset>, which combines nested file sets and paths into a
single directory. This allows explicit path -> fileset conversion.
* Added <filtered-path>, which applies selectors to nested file sets and paths.
* Added <list-fileset> debug task.
git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271577 13f79535-47bb-0310-9956-ffa450edef68
master
| @@ -0,0 +1,136 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.oro.text.GlobCompiler; | |||||
| import org.apache.oro.text.regex.MalformedPatternException; | |||||
| import org.apache.oro.text.regex.Pattern; | |||||
| import org.apache.oro.text.regex.Perl5Compiler; | |||||
| import org.apache.oro.text.regex.Perl5Matcher; | |||||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
| import org.apache.avalon.excalibur.i18n.Resources; | |||||
| /** | |||||
| * An abstract file selector that selects files based on name. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| */ | |||||
| public abstract class AbstractNameFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| private final static Resources REZ | |||||
| = ResourceManager.getPackageResources( AbstractNameFileSelector.class ); | |||||
| private Object m_type; | |||||
| private String m_pattern; | |||||
| private static final Object TYPE_GLOB = "glob"; | |||||
| private static final Object TYPE_REGEXP = "regexp"; | |||||
| /** | |||||
| * Sets the GLOB pattern to match the name against. | |||||
| */ | |||||
| public void setPattern( final String pattern ) | |||||
| throws TaskException | |||||
| { | |||||
| setPattern( TYPE_GLOB, pattern ); | |||||
| } | |||||
| /** | |||||
| * Sets the Regexp pattern to match the file basename against. | |||||
| */ | |||||
| public void setRegexp( final String pattern ) | |||||
| throws TaskException | |||||
| { | |||||
| setPattern( TYPE_REGEXP, pattern ); | |||||
| } | |||||
| /** | |||||
| * Sets the pattern and type to match | |||||
| */ | |||||
| private void setPattern( final Object type, final String pattern ) | |||||
| throws TaskException | |||||
| { | |||||
| if( m_type != null ) | |||||
| { | |||||
| final String message = REZ.getString( "nameselector.too-many-patterns.error" ); | |||||
| throw new TaskException( message ); | |||||
| } | |||||
| m_type = type; | |||||
| m_pattern = pattern; | |||||
| } | |||||
| /** | |||||
| * Accepts the file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| if( m_type == null ) | |||||
| { | |||||
| final String message = REZ.getString( "nameselector.no-pattern.error" ); | |||||
| throw new TaskException( message ); | |||||
| } | |||||
| // Create the pattern to match against | |||||
| final Pattern pattern; | |||||
| try | |||||
| { | |||||
| if( m_type == TYPE_GLOB ) | |||||
| { | |||||
| pattern = createGlobPattern( m_pattern ); | |||||
| } | |||||
| else | |||||
| { | |||||
| pattern = createRegexpPattern( m_pattern ); | |||||
| } | |||||
| } | |||||
| catch( MalformedPatternException e ) | |||||
| { | |||||
| final String message = REZ.getString( "nameselector.bad-pattern.error", m_pattern ); | |||||
| throw new TaskException( message ); | |||||
| } | |||||
| // Get the name to match against | |||||
| final String name = getNameForMatch( path, file ); | |||||
| // Compare the name against the pattern | |||||
| return new Perl5Matcher().matches( name, pattern ); | |||||
| } | |||||
| /** | |||||
| * Creates a GLOB pattern for matching the name against. | |||||
| */ | |||||
| protected Pattern createGlobPattern( final String pattern ) | |||||
| throws MalformedPatternException | |||||
| { | |||||
| // TODO - need to implement Ant-style patterns | |||||
| return new GlobCompiler().compile( pattern ); | |||||
| } | |||||
| /** | |||||
| * Creates a Regexp pattern for matching the name against. | |||||
| */ | |||||
| protected Pattern createRegexpPattern( final String pattern ) | |||||
| throws MalformedPatternException | |||||
| { | |||||
| return new Perl5Compiler().compile( pattern ); | |||||
| } | |||||
| /** | |||||
| * Returns the name to match against. | |||||
| */ | |||||
| protected abstract String getNameForMatch( final String path, | |||||
| final FileObject file ); | |||||
| } | |||||
| @@ -0,0 +1,57 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import java.util.ArrayList; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector that performs an AND of nested selectors. Performs | |||||
| * lazy evaluation. Returns true when no nested elements are supplied. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="and-selector" | |||||
| * @ant:type type="v-file-selector" name="and" | |||||
| */ | |||||
| public class AndFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| private final ArrayList m_selectors = new ArrayList(); | |||||
| /** | |||||
| * Adds a nested selector. | |||||
| */ | |||||
| public void add( final FileSelector selector ) | |||||
| { | |||||
| m_selectors.add( selector ); | |||||
| } | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| for( int i = 0; i < m_selectors.size(); i++ ) | |||||
| { | |||||
| final FileSelector fileSelector = (FileSelector)m_selectors.get(i ); | |||||
| if( ! fileSelector.accept( file, path, context ) ) | |||||
| { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| return true; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,32 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| /** | |||||
| * A file selector that selects files based on their base-name. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="basename-selector" | |||||
| * @ant:type type="v-file-selector" name="basename" | |||||
| */ | |||||
| public class BaseNameFileSelector | |||||
| extends AbstractNameFileSelector | |||||
| { | |||||
| /** | |||||
| * Returns the name to match against. | |||||
| */ | |||||
| protected String getNameForMatch( final String path, | |||||
| final FileObject file ) | |||||
| { | |||||
| return file.getName().getBaseName(); | |||||
| } | |||||
| } | |||||
| @@ -13,6 +13,7 @@ import java.util.ArrayList; | |||||
| import java.util.Iterator; | import java.util.Iterator; | ||||
| import org.apache.aut.vfs.FileObject; | import org.apache.aut.vfs.FileObject; | ||||
| import org.apache.aut.vfs.FileSystemException; | import org.apache.aut.vfs.FileSystemException; | ||||
| import org.apache.aut.vfs.FileType; | |||||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | import org.apache.avalon.excalibur.i18n.ResourceManager; | ||||
| import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
| import org.apache.myrmidon.api.AbstractTask; | import org.apache.myrmidon.api.AbstractTask; | ||||
| @@ -22,6 +23,7 @@ import org.apache.myrmidon.api.TaskException; | |||||
| * A task that copies files. | * A task that copies files. | ||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:task name="v-copy" | * @ant:task name="v-copy" | ||||
| */ | */ | ||||
| public class CopyFilesTask | public class CopyFilesTask | ||||
| @@ -121,6 +123,12 @@ public class CopyFilesTask | |||||
| // TODO - map destination name | // TODO - map destination name | ||||
| // TODO - maybe include empty dirs | |||||
| if( srcFile.getType() != FileType.FILE ) | |||||
| { | |||||
| continue; | |||||
| } | |||||
| // TODO - use scope here, to make sure that the result | // TODO - use scope here, to make sure that the result | ||||
| // is a descendent of the dest dir | // is a descendent of the dest dir | ||||
| final FileObject destFile = m_destDir.resolveFile( path ); | final FileObject destFile = m_destDir.resolveFile( path ); | ||||
| @@ -18,7 +18,9 @@ import org.apache.myrmidon.api.TaskException; | |||||
| * A compound file list, which is made up of several other file lists. | * A compound file list, which is made up of several other file lists. | ||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:data-type name="v-path" | * @ant:data-type name="v-path" | ||||
| * @ant:type type="v-path" name="v-path" | |||||
| */ | */ | ||||
| public class DefaultFileList implements FileList | public class DefaultFileList implements FileList | ||||
| { | { | ||||
| @@ -15,23 +15,24 @@ import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
| import org.apache.avalon.excalibur.i18n.Resources; | import org.apache.avalon.excalibur.i18n.Resources; | ||||
| import org.apache.myrmidon.api.TaskContext; | import org.apache.myrmidon.api.TaskContext; | ||||
| import org.apache.myrmidon.api.TaskException; | import org.apache.myrmidon.api.TaskException; | ||||
| import org.apache.myrmidon.framework.AbstractFileSet; | |||||
| /** | /** | ||||
| * A file set, that contains those files under a directory that match | * A file set, that contains those files under a directory that match | ||||
| * a set of patterns. | |||||
| * a set of selectors. | |||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:data-type name="v-fileset" | * @ant:data-type name="v-fileset" | ||||
| * @ant:type type="v-fileset" name="v-fileset" | |||||
| */ | */ | ||||
| public class PatternFileSet | |||||
| extends AbstractFileSet | |||||
| public class DefaultFileSet | |||||
| implements FileSet | implements FileSet | ||||
| { | { | ||||
| private final static Resources REZ = | private final static Resources REZ = | ||||
| ResourceManager.getPackageResources( PatternFileSet.class ); | |||||
| ResourceManager.getPackageResources( DefaultFileSet.class ); | |||||
| private FileObject m_dir; | private FileObject m_dir; | ||||
| private final AndFileSelector m_selector = new AndFileSelector(); | |||||
| /** | /** | ||||
| * Sets the root directory. | * Sets the root directory. | ||||
| @@ -41,6 +42,14 @@ public class PatternFileSet | |||||
| m_dir = dir; | m_dir = dir; | ||||
| } | } | ||||
| /** | |||||
| * Adds a selector. | |||||
| */ | |||||
| public void add( final FileSelector selector ) | |||||
| { | |||||
| m_selector.add( selector ); | |||||
| } | |||||
| /** | /** | ||||
| * Returns the contents of the set. | * Returns the contents of the set. | ||||
| */ | */ | ||||
| @@ -59,7 +68,7 @@ public class PatternFileSet | |||||
| final ArrayList stack = new ArrayList(); | final ArrayList stack = new ArrayList(); | ||||
| final ArrayList pathStack = new ArrayList(); | final ArrayList pathStack = new ArrayList(); | ||||
| stack.add( m_dir ); | stack.add( m_dir ); | ||||
| pathStack.add( "." ); | |||||
| pathStack.add( "" ); | |||||
| while( stack.size() > 0 ) | while( stack.size() > 0 ) | ||||
| { | { | ||||
| @@ -72,17 +81,19 @@ public class PatternFileSet | |||||
| for( int i = 0; i < children.length; i++ ) | for( int i = 0; i < children.length; i++ ) | ||||
| { | { | ||||
| FileObject child = children[ i ]; | FileObject child = children[ i ]; | ||||
| String childPath = path + '/' + child.getName().getBaseName(); | |||||
| if( child.getType() == FileType.FILE ) | |||||
| String childPath = path + child.getName().getBaseName(); | |||||
| // Check whether to include the file in the result | |||||
| if( m_selector.accept( child, childPath, context ) ) | |||||
| { | { | ||||
| // A regular file - add it straight to the result | |||||
| result.addElement( child, childPath ); | result.addElement( child, childPath ); | ||||
| } | } | ||||
| else | |||||
| if( child.getType() == FileType.FOLDER ) | |||||
| { | { | ||||
| // A folder - push it on to the stack | // A folder - push it on to the stack | ||||
| stack.add( 0, child ); | stack.add( 0, child ); | ||||
| pathStack.add( 0, childPath ); | |||||
| pathStack.add( 0, childPath + '/' ); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,44 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.aut.vfs.FileSystemException; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector that only selects files that exist. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="exists-selector" | |||||
| * @ant:type type="v-file-selector" name="exists" | |||||
| */ | |||||
| public class ExistenceFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| try | |||||
| { | |||||
| return file.exists(); | |||||
| } | |||||
| catch( FileSystemException e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -16,6 +16,7 @@ import org.apache.myrmidon.framework.DataType; | |||||
| * An ordered list of files. | * An ordered list of files. | ||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:role shorthand="v-path" | * @ant:role shorthand="v-path" | ||||
| */ | */ | ||||
| public interface FileList | public interface FileList | ||||
| @@ -0,0 +1,36 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| import org.apache.myrmidon.framework.DataType; | |||||
| /** | |||||
| * Accepts files as part of a set. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:role shorthand="v-file-selector" | |||||
| */ | |||||
| public interface FileSelector | |||||
| extends DataType | |||||
| { | |||||
| /** | |||||
| * Accepts a file. | |||||
| * | |||||
| * @param path The virtual path associated with the file. May be null | |||||
| * if such a path is not available. | |||||
| * @param file The file to select. | |||||
| * @param context The context to perform the selection in. | |||||
| */ | |||||
| boolean accept( FileObject file, String path, TaskContext context ) | |||||
| throws TaskException; | |||||
| } | |||||
| @@ -16,6 +16,7 @@ import org.apache.myrmidon.framework.DataType; | |||||
| * with it. | * with it. | ||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:role shorthand="v-fileset" | * @ant:role shorthand="v-fileset" | ||||
| */ | */ | ||||
| public interface FileSet | public interface FileSet | ||||
| @@ -30,5 +31,6 @@ public interface FileSet | |||||
| * @throws TaskException | * @throws TaskException | ||||
| * On error building the set. | * On error building the set. | ||||
| */ | */ | ||||
| FileSetResult getResult( TaskContext context ) throws TaskException; | |||||
| FileSetResult getResult( TaskContext context ) | |||||
| throws TaskException; | |||||
| } | } | ||||
| @@ -0,0 +1,71 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import java.util.ArrayList; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file-list which filters another. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="filtered-path" | |||||
| * @ant:type type="v-path" name="filtered-path" | |||||
| */ | |||||
| public class FilteredFileList | |||||
| implements FileList | |||||
| { | |||||
| private DefaultFileList m_fileList = new DefaultFileList(); | |||||
| private FileSelector m_selector; | |||||
| /** | |||||
| * Sets the selector to use to filter with. | |||||
| */ | |||||
| public void setCondition( final AndFileSelector selector ) | |||||
| { | |||||
| m_selector = selector; | |||||
| } | |||||
| /** | |||||
| * Sets the filelist to filter. | |||||
| */ | |||||
| public void add( final FileList fileList ) | |||||
| { | |||||
| m_fileList.add( fileList ); | |||||
| } | |||||
| /** | |||||
| * Returns the files in the list. | |||||
| */ | |||||
| public FileObject[] listFiles( final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| if( m_selector == null ) | |||||
| { | |||||
| throw new TaskException( "filteredfilelist.no-selector.error" ); | |||||
| } | |||||
| // Build the set of files | |||||
| final ArrayList acceptedFiles = new ArrayList(); | |||||
| final FileObject[] files = m_fileList.listFiles( context ); | |||||
| for( int i = 0; i < files.length; i++ ) | |||||
| { | |||||
| final FileObject file = files[ i ]; | |||||
| if( m_selector.accept( file, null, context ) ) | |||||
| { | |||||
| acceptedFiles.add( file ); | |||||
| } | |||||
| } | |||||
| return (FileObject[])acceptedFiles.toArray( new FileObject[acceptedFiles.size() ] ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,54 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file set that flattens its contents into a single directory. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="flat-fileset" | |||||
| * @ant:type type="v-fileset" name="flat-fileset" | |||||
| */ | |||||
| public class FlatFileSet | |||||
| implements FileSet | |||||
| { | |||||
| private DefaultFileList m_files = new DefaultFileList(); | |||||
| /** | |||||
| * Adds a file list to this set. | |||||
| */ | |||||
| public void add( final FileList files ) | |||||
| { | |||||
| m_files.add( files ); | |||||
| } | |||||
| /** | |||||
| * Returns the contents of the set. | |||||
| */ | |||||
| public FileSetResult getResult( final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| DefaultFileSetResult result = new DefaultFileSetResult(); | |||||
| FileObject[] files = m_files.listFiles( context ); | |||||
| for( int i = 0; i < files.length; i++ ) | |||||
| { | |||||
| final FileObject file = files[ i ]; | |||||
| // TODO - detect collisions | |||||
| result.addElement( file, file.getName().getBaseName() ); | |||||
| } | |||||
| return result; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,45 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.aut.vfs.FileSystemException; | |||||
| import org.apache.aut.vfs.FileType; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector which only selects folders, not files. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="is-folder-selector" | |||||
| * @ant:type type="v-file-selector" name="is-folder" | |||||
| */ | |||||
| public class IsDirectorySelector | |||||
| implements FileSelector | |||||
| { | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| try | |||||
| { | |||||
| return ( file.exists() && file.getType() == FileType.FOLDER ); | |||||
| } | |||||
| catch( FileSystemException e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,45 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.aut.vfs.FileSystemException; | |||||
| import org.apache.aut.vfs.FileType; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector which only selects files, not folders. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="is-file-selector" | |||||
| * @ant:type type="v-file-selector" name="is-file" | |||||
| */ | |||||
| public class IsFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| try | |||||
| { | |||||
| return ( file.exists() && file.getType() == FileType.FILE ); | |||||
| } | |||||
| catch( FileSystemException e ) | |||||
| { | |||||
| throw new TaskException( e.getMessage(), e ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,48 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.AbstractTask; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A debug task, that lists the contents of a {@link FileSet}. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:task name="v-list-fileset" | |||||
| */ | |||||
| public class ListFileSetTask | |||||
| extends AbstractTask | |||||
| { | |||||
| private FileSet m_fileSet; | |||||
| public void set( final FileSet fileSet ) | |||||
| { | |||||
| m_fileSet = fileSet; | |||||
| } | |||||
| /** | |||||
| * Execute task. | |||||
| */ | |||||
| public void execute() | |||||
| throws TaskException | |||||
| { | |||||
| FileSetResult result = m_fileSet.getResult( getContext() ); | |||||
| final FileObject[] files = result.getFiles(); | |||||
| final String[] paths = result.getPaths(); | |||||
| for( int i = 0; i < files.length; i++ ) | |||||
| { | |||||
| final FileObject file = files[ i ]; | |||||
| final String path = paths[ i ]; | |||||
| getLogger().info( path + " = " + file ); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -17,7 +17,7 @@ import org.apache.myrmidon.api.TaskException; | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * @version $Revision$ $Date$ | * @version $Revision$ $Date$ | ||||
| * | * | ||||
| * @ant:task name="v-list-files" | |||||
| * @ant:task name="v-list-path" | |||||
| */ | */ | ||||
| public class ListFilesTask | public class ListFilesTask | ||||
| extends AbstractTask | extends AbstractTask | ||||
| @@ -0,0 +1,32 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| /** | |||||
| * A file selector that selects files based on their name. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="name-selector" | |||||
| * @ant:type type="v-file-selector" name="name" | |||||
| */ | |||||
| public class NameFileSelector | |||||
| extends AbstractNameFileSelector | |||||
| { | |||||
| /** | |||||
| * Returns the name to match against. | |||||
| */ | |||||
| protected String getNameForMatch( final String path, | |||||
| final FileObject file ) | |||||
| { | |||||
| return path; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,50 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector that negates a nested file selector. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="not-selector" | |||||
| * @ant:type type="v-file-selector" name="not" | |||||
| */ | |||||
| public class NotFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| private FileSelector m_selector; | |||||
| /** | |||||
| * Sets the nested selector. | |||||
| */ | |||||
| public void set( final FileSelector selector ) | |||||
| { | |||||
| m_selector = selector; | |||||
| } | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| if( m_selector == null ) | |||||
| { | |||||
| throw new TaskException( "notfileselector.no-selector.error" ); | |||||
| } | |||||
| return ! m_selector.accept( file, path, context ); | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import java.util.ArrayList; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| import org.apache.myrmidon.api.TaskContext; | |||||
| import org.apache.myrmidon.api.TaskException; | |||||
| /** | |||||
| * A file selector that performs an OR of nested selectors. Performs | |||||
| * lazy evaluation. Returns true when no nested elements are supplied. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="or-selector" | |||||
| * @ant:type type="v-file-selector" name="or" | |||||
| */ | |||||
| public class OrFileSelector | |||||
| implements FileSelector | |||||
| { | |||||
| private final ArrayList m_selectors = new ArrayList(); | |||||
| /** | |||||
| * Adds a nested selector. | |||||
| */ | |||||
| public void add( final FileSelector selector ) | |||||
| { | |||||
| m_selectors.add( selector ); | |||||
| } | |||||
| /** | |||||
| * Accepts a file. | |||||
| */ | |||||
| public boolean accept( final FileObject file, | |||||
| final String path, | |||||
| final TaskContext context ) | |||||
| throws TaskException | |||||
| { | |||||
| for( int i = 0; i < m_selectors.size(); i++ ) | |||||
| { | |||||
| final FileSelector fileSelector = (FileSelector)m_selectors.get(i ); | |||||
| if( fileSelector.accept( file, path, context ) ) | |||||
| { | |||||
| return true; | |||||
| } | |||||
| } | |||||
| // Return true if there are no selectors, false if there are | |||||
| return (m_selectors.size() == 0); | |||||
| } | |||||
| } | |||||
| @@ -48,7 +48,7 @@ public class PathFileList implements FileList | |||||
| String element = elements[ i ]; | String element = elements[ i ]; | ||||
| try | try | ||||
| { | { | ||||
| result[ i ] = fileSystemManager.resolveFile( element ); | |||||
| result[ i ] = fileSystemManager.resolveFile( context.getBaseDirectory(), element ); | |||||
| } | } | ||||
| catch( FileSystemException e ) | catch( FileSystemException e ) | ||||
| { | { | ||||
| @@ -1,7 +1,17 @@ | |||||
| bad-convert-string-to-file.error=Could not convert URI "{0}" into a file object. | bad-convert-string-to-file.error=Could not convert URI "{0}" into a file object. | ||||
| fileset.dir-not-set.error=Fileset root directory is not set. | fileset.dir-not-set.error=Fileset root directory is not set. | ||||
| fileset.list-files.error=Could not list the files in folder "{0}". | fileset.list-files.error=Could not list the files in folder "{0}". | ||||
| copyfilestask.no-source.error=No source files specified for {0} task. | copyfilestask.no-source.error=No source files specified for {0} task. | ||||
| copyfilestask.no-destination.error=No destination file or directory specified for {0} task. | copyfilestask.no-destination.error=No destination file or directory specified for {0} task. | ||||
| copyfilestask.no-destination.error=No destination directory specified for {0} task. | copyfilestask.no-destination.error=No destination directory specified for {0} task. | ||||
| copyfilestask.copy-file.error=Could not copy "{0}" to "{1}". | copyfilestask.copy-file.error=Could not copy "{0}" to "{1}". | ||||
| nameselector.too-many-patterns.error=Too many name patterns specified. | |||||
| nameselector.no-pattern.error=No name pattern specified. | |||||
| nameselector.bad-pattern.error=Invalid name pattern "{0}". | |||||
| filteredfilelist.no-selector.error=No filter criteria specified. | |||||
| notfileselector.no-selector.error=No selector specified. | |||||
| @@ -15,9 +15,12 @@ import org.apache.myrmidon.api.TaskException; | |||||
| * A file list that contains a single file. | * A file list that contains a single file. | ||||
| * | * | ||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | ||||
| * | |||||
| * @ant:data-type name="v-file" | * @ant:data-type name="v-file" | ||||
| * @ant:type type="v-path" name="v-file" | |||||
| */ | */ | ||||
| public class SingletonFileList implements FileList | |||||
| public class SingletonFileList | |||||
| implements FileList | |||||
| { | { | ||||
| private FileObject m_file; | private FileObject m_file; | ||||
| @@ -0,0 +1,32 @@ | |||||
| /* | |||||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||||
| * | |||||
| * This software is published under the terms of the Apache Software License | |||||
| * version 1.1, a copy of which has been included with this distribution in | |||||
| * the LICENSE.txt file. | |||||
| */ | |||||
| package org.apache.antlib.vfile; | |||||
| import org.apache.aut.vfs.FileObject; | |||||
| /** | |||||
| * A file selector that selects files based on their URL. | |||||
| * | |||||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||||
| * @version $Revision$ $Date$ | |||||
| * | |||||
| * @ant:data-type name="url-selector" | |||||
| * @ant:type type="v-file-selector" name="url" | |||||
| */ | |||||
| public class UrlFileSelector | |||||
| extends AbstractNameFileSelector | |||||
| { | |||||
| /** | |||||
| * Returns the name to match against. | |||||
| */ | |||||
| protected String getNameForMatch( final String path, | |||||
| final FileObject file ) | |||||
| { | |||||
| return file.getName().getURI(); | |||||
| } | |||||
| } | |||||