* 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-ffa450edef68master
@@ -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 org.apache.aut.vfs.FileObject; | |||
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.Resources; | |||
import org.apache.myrmidon.api.AbstractTask; | |||
@@ -22,6 +23,7 @@ import org.apache.myrmidon.api.TaskException; | |||
* A task that copies files. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @ant:task name="v-copy" | |||
*/ | |||
public class CopyFilesTask | |||
@@ -121,6 +123,12 @@ public class CopyFilesTask | |||
// 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 | |||
// is a descendent of the dest dir | |||
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. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @ant:data-type name="v-path" | |||
* @ant:type type="v-path" name="v-path" | |||
*/ | |||
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.myrmidon.api.TaskContext; | |||
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 set of patterns. | |||
* a set of selectors. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @ant:data-type name="v-fileset" | |||
* @ant:type type="v-fileset" name="v-fileset" | |||
*/ | |||
public class PatternFileSet | |||
extends AbstractFileSet | |||
public class DefaultFileSet | |||
implements FileSet | |||
{ | |||
private final static Resources REZ = | |||
ResourceManager.getPackageResources( PatternFileSet.class ); | |||
ResourceManager.getPackageResources( DefaultFileSet.class ); | |||
private FileObject m_dir; | |||
private final AndFileSelector m_selector = new AndFileSelector(); | |||
/** | |||
* Sets the root directory. | |||
@@ -41,6 +42,14 @@ public class PatternFileSet | |||
m_dir = dir; | |||
} | |||
/** | |||
* Adds a selector. | |||
*/ | |||
public void add( final FileSelector selector ) | |||
{ | |||
m_selector.add( selector ); | |||
} | |||
/** | |||
* Returns the contents of the set. | |||
*/ | |||
@@ -59,7 +68,7 @@ public class PatternFileSet | |||
final ArrayList stack = new ArrayList(); | |||
final ArrayList pathStack = new ArrayList(); | |||
stack.add( m_dir ); | |||
pathStack.add( "." ); | |||
pathStack.add( "" ); | |||
while( stack.size() > 0 ) | |||
{ | |||
@@ -72,17 +81,19 @@ public class PatternFileSet | |||
for( int i = 0; i < children.length; 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 ); | |||
} | |||
else | |||
if( child.getType() == FileType.FOLDER ) | |||
{ | |||
// A folder - push it on to the stack | |||
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. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @ant:role shorthand="v-path" | |||
*/ | |||
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. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @ant:role shorthand="v-fileset" | |||
*/ | |||
public interface FileSet | |||
@@ -30,5 +31,6 @@ public interface FileSet | |||
* @throws TaskException | |||
* 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> | |||
* @version $Revision$ $Date$ | |||
* | |||
* @ant:task name="v-list-files" | |||
* @ant:task name="v-list-path" | |||
*/ | |||
public class ListFilesTask | |||
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 ]; | |||
try | |||
{ | |||
result[ i ] = fileSystemManager.resolveFile( element ); | |||
result[ i ] = fileSystemManager.resolveFile( context.getBaseDirectory(), element ); | |||
} | |||
catch( FileSystemException e ) | |||
{ | |||
@@ -1,7 +1,17 @@ | |||
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.list-files.error=Could not list the files in folder "{0}". | |||
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 directory specified for {0} task. | |||
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. | |||
* | |||
* @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
* | |||
* @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; | |||
@@ -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(); | |||
} | |||
} |